home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / utils / pcxutils / pcx2raw.c < prev    next >
C/C++ Source or Header  |  1993-07-14  |  5KB  |  205 lines

  1. /**************************************************************************
  2.  PCX2RAW - by Lee Hamel (Patch), hamell@cx.pdx.edu, *Avalanche* coder
  3.  July 14th, 1993
  4. **************************************************************************/
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <malloc.h>
  9.  
  10. typedef struct {
  11.         char    manufacturer;
  12.         char    version;
  13.         char    encoding;
  14.         char    bits_per_pixel;
  15.         int     xmin,ymin;
  16.         int     xmax,ymax;
  17.         int     hres;
  18.         int     vres;
  19.         char    palette[48];
  20.         char    reserved;
  21.         char    colour_planes;
  22.         int     bytes_per_line;
  23.         int     palette_type;
  24.         char    filler[58];
  25.            } PCXHEAD;
  26.  
  27. #define         PCXHEADSIZE     sizeof(PCXHEAD)
  28.  
  29. PCXHEAD header;
  30. unsigned int width, depth, bytes, i, i2, showflag = 0;
  31. unsigned char palette[768];
  32. FILE *infile, *outfile;
  33. unsigned char *tempptr, *picture;
  34. char pcxfile[20],rawfile[20],palfile[20];
  35.  
  36. void Read_PCX_Line(unsigned int vidoffset)
  37. {
  38.   unsigned char c, run;
  39.   unsigned int n = 0;
  40.  
  41.   _asm
  42.   {
  43.     cld
  44.     mov         di,[vidoffset]
  45.   }
  46.  
  47.   do
  48.   {
  49.     c = fgetc(infile) & 0xff;
  50.     if ((c & 0xc0) == 0xc0)             /* if it's a run of bytes field */
  51.     {
  52.       run = c & 0x3f;                   /* and off the high bits */
  53.       c = fgetc(infile);                /* get the run byte */
  54.       n += run;                         /* run the byte */
  55.       for (i2 = 0; i2 < run; i2++)
  56.     *picture++ = c;
  57.  
  58.       if (showflag == 0)
  59.       {
  60.     _asm
  61.     {
  62.         mov     ax,0a000h
  63.         mov     es,ax
  64.         mov     al,[c]
  65.         xor     ch,ch
  66.         mov     cl,[run]
  67.         rep     stosb
  68.     }
  69.       }
  70.     }
  71.     else
  72.     {
  73.       n++;
  74.       *picture++ = c;
  75.  
  76.       if (showflag == 0)
  77.       {
  78.     _asm
  79.     {
  80.         mov     ax,0a000h
  81.         mov     es,ax
  82.         mov     al,[c]
  83.         stosb
  84.     }
  85.       }
  86.     }
  87.   }
  88.   while (n < bytes);
  89. }
  90.  
  91. void Unpack_PCX_File(void)
  92. {
  93.   for (i = 0; i < 768; i++)
  94.     palette[i] = palette[i] >> 2;
  95.  
  96.   if (showflag == 0)
  97.   {
  98.     _asm
  99.     {
  100.         mov     ax,0013h
  101.         int     10h
  102.         mov     ax,1012h
  103.         xor     bx,bx
  104.         mov     cx,256
  105.         mov     dx,offset palette
  106.         int     10h
  107.     }
  108.   }
  109.  
  110.   tempptr = picture = (unsigned char *) malloc((size_t) 64000);
  111.   for (i = 0; i < depth; i++)
  112.       Read_PCX_Line(i * 320);
  113.   /* reset pointer back to beginning */
  114.   picture = tempptr;
  115. }
  116.  
  117. void Dump_PCX(void)
  118. {
  119.     outfile = fopen(palfile,"wb");
  120.     for (i = 0; i < 768; i++)
  121.     fprintf(outfile,"%c",palette[i]);
  122.     fclose(outfile);
  123.  
  124.     outfile = fopen(rawfile,"wb");
  125.     for (i = 0; i < 64000; i++)
  126.     fprintf(outfile,"%c",*picture++);
  127.     fclose(outfile);
  128.  
  129.     if (showflag == 1)
  130.     {
  131.     _asm {
  132.          mov ax,0003h
  133.          int 10h
  134.          }
  135.     }
  136. }
  137.  
  138. void Help(void)
  139. {
  140.   printf("\n");
  141.   printf("PCX2RAW - Converts a PCX pic to RAW format\n");
  142.   printf("    by Patch (hamell@rigel.cs.pdx.edu)    \n");
  143.   printf("──────────────────────────────────────────\n");
  144.   printf("Usage: pcx2raw PCXFILE [-SHOW]\n");
  145.   printf("where: PCXFILE    - the PCX file to read (no extension)\n");
  146.   printf("       -SHOW      - show the PCX to the screen\n\n");
  147.   printf("Example call: pcx2raw picture\n");
  148.   printf("- This will read the file PICTURE and output the palette to PICTURE.PAL\n");
  149.   printf("  and the image data to PICTURE.RAW\n");
  150.   exit(1);
  151. }
  152.  
  153. void main(int argc, char *argv[])
  154. {
  155.   if (argc == 1) Help();
  156.  
  157.   {
  158.     strcpy(pcxfile,argv[1]);
  159.     strcpy(rawfile,argv[1]);
  160.     strcpy(palfile,argv[1]);
  161.     strcat(pcxfile,".pcx");
  162.     strcat(rawfile,".raw");
  163.     strcat(palfile,".pal");
  164.  
  165.     if ((infile = fopen(pcxfile,"rb")) != NULL)
  166.     {
  167.       if (fread((char *)&header,1,PCXHEADSIZE,infile) == PCXHEADSIZE)
  168.       {
  169.     if (header.manufacturer == 0x0a && header.version == 5)
  170.     {
  171.       if (!fseek(infile,-769L,SEEK_END))
  172.       {
  173.         if (fgetc(infile) == 0x0c && fread(palette,1,768,infile) == 768)
  174.         {
  175.           fseek(infile,128L,SEEK_SET);
  176.           width = header.xmax - header.xmin + 1;
  177.           depth = header.ymax - header.ymin + 1;
  178.           bytes = header.bytes_per_line;
  179.  
  180.           /*
  181.           printf("Width = %d\n",width);
  182.           printf("Depth = %d\n",depth);
  183.           printf("Bytes = %d\n",bytes);
  184.           printf("Chars per row = %d\n",charsrow);
  185.           */
  186.  
  187.           showflag = stricmp(argv[2],"-SHOW");
  188.           Unpack_PCX_File();
  189.           Dump_PCX();
  190.  
  191.           free((unsigned char *) picture);
  192.         }
  193.         else printf("Error reading palette\n");
  194.       }
  195.       else printf("Error seeking to palette\n");
  196.     }
  197.     else printf("Not a 256 color PCX file\n");
  198.       }
  199.       else printf("Error reading %s\n",argv[4]);
  200.       fclose(infile);
  201.     }
  202.     else printf("Error opening %s\n",argv[4]);
  203.   }
  204. }
  205.